{$MODE objfpc}
{$H+}

unit PythonModSupport;

// Module support interface

interface
uses PythonTypes;

const 
  PYTHON_API_VERSION = 1013;
  PYTHON_API_STRING = '1013';


// If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
//   to mean Py_ssize_t 
// #ifdef PY_SSIZE_T_CLEAN
// #define PyArg_Parse      _PyArg_Parse_SizeT
// #define PyArg_ParseTuple   _PyArg_ParseTuple_SizeT
// #define PyArg_ParseTupleAndKeywords  _PyArg_ParseTupleAndKeywords_SizeT
// #define PyArg_VaParse      _PyArg_VaParse_SizeT
// #define PyArg_VaParseTupleAndKeywords  _PyArg_VaParseTupleAndKeywords_SizeT
// #define Py_BuildValue      _Py_BuildValue_SizeT
// #define Py_VaBuildValue      _Py_VaBuildValue_SizeT
// #else
// function _Py_VaBuildValue_SizeT(PChar, va_list): PyObjectPtr;
// #endif

function PyArg_Parse(ob: PyObjectPtr; st: PChar; args: Array of Const): Integer; cdecl; external; 
function PyArg_ParseTuple(ob: PyObjectPtr; st: PChar; args: Array of Const): Integer; cdecl; external;
function PyArg_ParseTupleAndKeywords(o1, o2: PyObjectPtr; s1: PChar; s2: PPChar; args: Array of Const): Integer; cdecl; external;
function PyArg_UnpackTuple(o1: PyObjectPtr; s1: PChar; ps1, ps2: Py_ssize_t; args: Array of Const): Integer; cdecl; external;
function Py_BuildValue(s1: PChar; args: Array of Const): PyObjectPtr; cdecl; external;
function _Py_BuildValue_SizeT(s1: PChar; args: Array of Const): PyObjectPtr; cdecl; external;
function _PyArg_NoKeywords(funcname: PChar; kw: PyObjectPtr): Integer; cdecl; external;

//function PyArg_VaParse(ob: PyObjectPtr; s1: PChar, va_list): Integer;
//function PyArg_VaParseTupleAndKeywords(PyObjectPtr, PyObjectPtr, PChar, char **, va_list);
//function Py_VaBuildValue(PChar, va_list): PyObjectPtr;

function PyModule_AddObject(ob: PyObjectPtr; s1: PChar; ob2: PyObjectPtr): Integer; cdecl; external;
function PyModule_AddIntConstant(ob: PyObjectPtr; name: PChar; con: Long): Integer; cdecl; external;
function PyModule_AddStringConstant(ob: PyObjectPtr; name, val: PChar): Integer; cdecl; external;


   // The API version is maintained (independently from the Python version)
   // so we can detect mismatches between the interpreter and dynamically
   // loaded modules.  These are diagnosed by an error message but
   // the module is still loaded (because the mismatch can only be tested
   // after loading the module).  The error message is intended to
   // explain the core dump a few seconds later.
   // 
   // The symbol PYTHON_API_STRING defines the same value as a string
   // literal.  *** PLEASE MAKE SURE THE DEFINITIONS MATCH. ***
   // 
   // Please add a line or two to the top of this log for each API
   // version change:
   // 
   // 22-Feb-2006  MvL  1013  PEP 353 - long indices for sequence lengths
   // 
   // 19-Aug-2002  GvR  1012  Changes to string object struct for
   //         interning changes, saving 3 bytes.
   // 
   // 17-Jul-2001 GvR 1011  Descr-branch, just to be on the safe side
   // 
   // 25-Jan-2001  FLD     1010    Parameters added to PyCode_New() and
   //                              PyFrame_New(); Python 2.1a2
   // 
   // 14-Mar-2000  GvR     1009    Unicode API added
   // 
   // 3-Jan-1999  GvR 1007  Decided to change back!  (Don't reuse 1008!)
   // 
   // 3-Dec-1998  GvR 1008  Python 1.5.2b1
   // 
   // 18-Jan-1997 GvR 1007  string interning and other speedups
   // 
   // 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-(
   // 
   // 30-Jul-1996 GvR Slice and ellipses syntax added
   // 
   // 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-)
   // 
   // 7-Nov-1995  GvR Keyword arguments (should've been done at 1.3 :-( )
   // 
   // 10-Jan-1995 GvR Renamed globals to new naming scheme
   // 
   // 9-Jan-1995  GvR Initial version (incompatible with older API)


// #if SIZEOF_SIZE_T != SIZEOF_INT
//  // On a 64-bit system, rename the Py_InitModule4 so that 2.4
//  //   modules cannot get loaded into a 2.5 interpreter 
// #define Py_InitModule4 Py_InitModule4_64
// #endif
// 
// #ifdef Py_TRACE_REFS
//  /* When we are tracing reference counts, rename Py_InitModule4 so
//     modules compiled with incompatible settings will generate a
//     link-time error. */
//  #if SIZEOF_SIZE_T != SIZEOF_INT
//  #undef Py_InitModule4
//  #define Py_InitModule4 Py_InitModule4TraceRefs_64
//  #else
//  #define Py_InitModule4 Py_InitModule4TraceRefs
//  #endif
// #endif

function Py_InitModule4(name: PChar; methods: PyMethodDefPtr; doc: PChar; self: PyObjectPtr; apiver: Integer): PyObjectPtr; cdecl; external;

function Py_InitModule(name: PChar; methods: PyMethodDefPtr): PyObjectPtr; overload;
function Py_InitModule(name: String; methods: PyMethodDefPtr; doc: String): PyObjectPtr; overload;

var
  _Py_PackageContext: PChar; cvar; external;

implementation

function Py_InitModule(name: PChar; methods: PyMethodDefPtr): PyObjectPtr; overload;
begin
	result := Py_InitModule4(name, methods, nil, nil, PYTHON_API_VERSION);
end;

function Py_InitModule(name: String; methods: PyMethodDefPtr; doc: String): PyObjectPtr; overload;
begin
	result := Py_InitModule4(PChar(name), methods, PChar(doc), nil, PYTHON_API_VERSION);
end;

end.